// database文件夹用来存放和数据库操作有关的文件
// init.js文件用来作数据库的连接和一些初始化的事情
const mongoose = require('mongoose')
const db = "mongodb://localhost/simle-db"
// node的glob模块允许你使用 * 等符号，来写一个glob规则，像在shell里一样，获取匹配对应规则文件。
const glob = require('glob')
// resolve: 将一系列路径或路径段解析为绝对路径。
const {resolve} = require('path')

// 使用了glob.sync同步引入所有的schema文件，然后用forEach的方法require（引入）进来
exports.initSchemas = () =>{
  glob.sync(resolve(__dirname,'./schema/','**/*.js')).forEach(require)
}

exports.connect = ()=>{
    //连接数据库
    mongoose.connect(db)
    // 一般数据库连接失败，我们会重新连接，但这个重连也是需要有一个次数的，比如连接3次失败，我们在服务端抛出异常。
    // 首先声明一个最大连接数maxConnectTimes
    let maxConnectTimes = 0
    // 增加Promise的支持，确保必须先连接数据库后，再作其他事情
    return  new Promise((resolve,reject)=>{
      //把所有连接放到这里

      //增加数据库连接的事件监听,当连接断开时,进行重连.
      mongoose.connection.on('disconnected',()=>{
          console.log('***********数据库断开***********')
          if(maxConnectTimes<3){
              maxConnectTimes++
              mongoose.connect(db)
          }else{
              reject()
              throw new Error('数据库出现问题，程序无法搞定，请人为修理......')
          }

      })

      //数据库出现错误的时候,当连接断开时,把连接次数加1,并重新连接数据库.
    //   当重连次数超过3次,抛出异常,用reject() 通知 promise.
      mongoose.connection.on('error',err=>{
          console.log('***********数据库错误***********')
          if(maxConnectTimes<3){
              maxConnectTimes++
              mongoose.connect(db)
          }else{
              reject(err)
              throw new Error('数据库出现问题，程序无法搞定，请人为修理......')
          }

      })
      //链接打开的时候
      mongoose.connection.once('open',()=>{
          console.log('MongoDB connected successfully')
          resolve()
      })

    })


}
